package com.example.chatrecommendation.tool;

import com.example.chatrecommendation.bean.entity.Students;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUtil {

	private final JwtProperties jwtProperties;
	private final JwtConfig jwtConfig;

	public JwtUtil(JwtProperties jwtProperties, JwtConfig jwtConfig) {
		this.jwtProperties = jwtProperties;
		this.jwtConfig = jwtConfig;
	}

	/**
	 * 创建token
	 *
	 * @param students 用户信息
	 * @return jwt字符串
	 */
	public String createJWT(Students students) {
		Map<String, Object> claims = new HashMap<>();
		claims.put("studentId", students.getId());
		// 指定签名的时候使用的签名算法，也就是header那部分
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

		// 生成JWT的时间
		long expMillis = System.currentTimeMillis() + jwtConfig.getExpirationTime();
		Date exp = new Date(expMillis);

		// 设置jwt的body
		JwtBuilder builder = Jwts.builder()
				// 如果有私有声明，一定要先设置这个自己创建的私有的声明，这个是给builder的claim赋值，一旦写在标准的声明赋值之后，就是覆盖了那些标准的声明的
				.setClaims(claims)
				// 设置签名使用的签名算法和签名使用的秘钥
				.signWith(signatureAlgorithm, jwtConfig.getSecretKey())
				// 设置过期时间
				.setExpiration(exp);

		return builder.compact();
	}

	/**
	 * Token解密
	 *
	 * @param token 加密后的token
	 * @return
	 */
	public Claims parseJWT(String token) {
		// 得到DefaultJwtParser
		Claims claims = Jwts.parser()
				// 设置签名的秘钥
				.setSigningKey(jwtProperties.getAdminSecretKey())
				// 设置需要解析的jwt
				.parseClaimsJws(token).getBody();
		return claims;
	}

}
